Android系统架构 —— 图形系统概述

补充中

疑问

  • BufferQueue中的数据(GraphicBuffer)又是怎么传递给Layer的呢?
  • SurfaceFlinger是怎么合成所有Layer数据的?一次合成多少个Layer?
  • Surface和窗口 or Window 有什么关系?一个窗口会有多个图层,比如导航栏、content、底部栏等View,是一个窗口中所有View都投射到一个Surface中么?
  • Window和Activity、View是什么关系?

image-20210921161419392

三种上屏方式

两种方式将图像绘制到屏幕上:

  • Canvas
  • OpenGL ES
  • Vulkan

软件、硬件加速区别?

无论哪种方式,都是将图像渲染到Surface上。

Surface:

Surface是一个窗口,例如一个Activity是一个Surface,一个Dialog也是一个Surface。Surface位于App进程,承载了窗口的图形数据,与SurfaceFlinger侧的Layer对应。

BufferQueue:

BufferQueue是Surface和Layer的纽带。

Native层的Surface实现了ANativeWindow结构体,构造函数中持有一个IGraphicBufferProducer,用于和BufferQueue交互。

1
2
3
4
5
6
类声明:
class Surface
: public ANativeObjectBase<ANativeWindow, Surface, RefBase>

构造函数:
Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp)

上层图形数据渲染到Surface,然后Surface通过IGraphicBufferProducer把GraphicBuffer提交到BufferQueue,即图形数据实际是渲染到BufferQueue中的一个GraphicBuffer,让SurfaceFlinger执行后续的合成显示工作。

显示?

HWC

Hardware Composer,硬件混合渲染器,显示子系统的硬件抽象实现。

HAL:
Hardware Abstraction Layer,硬件抽象层。Android HAL是连接Android Framework和Kernel的重要桥梁,主要目的是向下屏蔽设备及其驱动的实现细节,向上为系统服务以及Framework提供统一的设备访问接口。参考Android系统框架:>>

BufferQueue

Android图形系统包含两对生产者、消费者模型,都是通过BufferQueue进行连接:

  1. Canvas和OpenGL ES生成图形数据,SurfaceFlinger消费数据;
  2. SurfaceFlinger合成所有Layer的图形数据,Display进行显示。

SurfaceFlinger

Surface代表App进程中的一个窗口,承载窗口的图形数据。SurfaceFlinger是系统进程中合成所有窗口(Layer)图形数据的系统服务,然后送显到屏幕。

SurfaceFlinger既是上层应用的图形数据消费者,又是Display的生产者。起到承上启下的作用。

官方架构图:

img

屏幕画面显示流程

Android显示系统,一般包括CPU、GPU、Display三个硬解部分。其中:

  • CPU:负责计算图形数据,并交给GPU
  • GPU:对图形数据进行渲染,渲染好后放到buffer中(其中SurfaceFlinger负责buffer的合成)

  • Display:屏幕或显示器,把GPU中合成好的buffer数据显示到屏幕上

CPU计算图形数据

CPU计算图形数据指的就是View树的绘制过程,也就是Activity对应视图树从根布局DecorView层层遍历View,分别执行measure、layout、draw过程。该流程生成纹理和多边形,并送到GPU。

1
measure+layout+draw  ->  polygons texture
GPU合成图形数据

GPU将CPU生成的纹理、多边形进行栅格化以及合成。

1
polygons texture -> rasterization

OpenGL的绘制流程中好像也有栅格化?

Display显示图形数据

常说的16ms屏幕刷新一次,其实就是系统硬件16ms发送一次时钟信号,即vsync信号,通知Display将最新合成的图形数据显示到屏幕上。

三缓冲

为了解决双缓冲带来的卡顿问题,Android黄油计划推出了三缓冲,CPU、GPU、SurfaceFlinger各占一个Buffer,并行处理图像。

参考文档